package com.atguigu.lease.common.utils;

import com.atguigu.lease.common.exception.LeaseException;
import com.atguigu.lease.common.result.ResultCodeEnum;
import io.jsonwebtoken.*;
import io.jsonwebtoken.security.Keys;

import javax.crypto.SecretKey;
import java.util.Date;


public class JwtUtil {

    //密钥
    private static SecretKey tokenSignKey = Keys.hmacShaKeyFor("M0PKKI6pYGVWWfDZw90a0lTpGYX1d4AQ".getBytes());


    public   static String createToken(Long userId ,String username){
        String token = Jwts.builder().
                //设置令牌有效时间 这里是当前系统时间+1小时 也就是一小时
                setExpiration(new Date(System.currentTimeMillis()+3600000)).
                //设置主题 可不

                setSubject("LOGIN_USER").
            // 自定义声明
                    claim("userId", userId).
                    claim("username",username).
                //使用密钥和算法进行签名
                signWith(tokenSignKey, SignatureAlgorithm.HS256).
                //组合 将头部和负载和签名组合 生成jwt token
                compact();

        return token;

    }

    public static  Claims    parseToken(String token){
        //token为空说明未登录
        if (token==null){
            throw new LeaseException(ResultCodeEnum.ADMIN_LOGIN_AUTH);
        }

        try {
            //根据密钥解析token
            JwtParser jwtParser = Jwts.parserBuilder().setSigningKey(tokenSignKey).build();
            //获取负载部分 即我们自定义的声明都在里面 如username
            Claims claimsJws = jwtParser.parseClaimsJws(token).getBody();

            return claimsJws;
        }
        //过期捕获
        catch (ExpiredJwtException e) {
            throw new LeaseException(ResultCodeEnum.TOKEN_EXPIRED);
        }
        //非法捕获
        catch (JwtException j){
            throw new LeaseException(ResultCodeEnum.TOKEN_INVALID);
        }

    }

    public static void main(String[] args) {

        System.out.println(JwtUtil.createToken(7L,"17876798082"));
    }

}
